সি# এ ডেলিগেট এবং ইভেন্ট খুবই গুরুত্বপূর্ণ বৈশিষ্ট্য, যা প্রোগ্রামে ফাংশন পাস করা এবং নির্দিষ্ট ঘটনাগুলোর প্রতিক্রিয়া জানানো সহজ করে। ডেলিগেট ফাংশন পয়েন্টার হিসেবে কাজ করে, আর ইভেন্ট বিশেষ পরিস্থিতি বা পরিবর্তনের প্রতিক্রিয়ায় নির্দিষ্ট ফাংশন চালাতে সাহায্য করে। নিচে ডেলিগেট এবং ইভেন্ট নিয়ে বিস্তারিত আলোচনা করা হলো।
ডেলিগেট হলো এমন এক ধরনের ডেটা টাইপ যা একটি ফাংশনের রেফারেন্স ধরে রাখতে সক্ষম। ডেলিগেটের মাধ্যমে প্রোগ্রামের একটি অংশ অন্য অংশের জন্য ফাংশন ডিফাইন করতে পারে এবং প্রয়োজনে সেটি চালাতে পারে।
একটি ডেলিগেটকে ডিক্লার করার জন্য delegate
কীওয়ার্ড ব্যবহার করা হয় এবং এটি সাধারণত মেথডের স্বাক্ষরের (signature) উপর ভিত্তি করে থাকে। নিচে একটি সাধারণ ডেলিগেটের ডিক্লারেশন দেওয়া হলো:
public delegate void MyDelegate(string message);
এখানে MyDelegate
নামক একটি ডেলিগেট আছে, যা void
টাইপের এবং একটি string
প্যারামিটার গ্রহণ করে।
using System;
public class Program
{
// ডেলিগেট ডিক্লারেশন
public delegate void MyDelegate(string message);
// একটি মেথড যা ডেলিগেট টাইপ মিলে
public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
public static void Main()
{
// ডেলিগেট ইনস্ট্যান্স তৈরি এবং মেথড এসাইন করা
MyDelegate del = PrintMessage;
// ডেলিগেট কল করা
del("Hello from delegate!");
}
}
১. MyDelegate
নামে একটি ডেলিগেট ডিক্লেয়ার করা হয়েছে, যা void
টাইপ এবং একটি string
প্যারামিটার গ্রহণ করে। ২. PrintMessage
নামে একটি মেথড তৈরি করা হয়েছে, যা MyDelegate
এর স্বাক্ষর অনুযায়ী কাজ করে। ৩. del
নামক একটি ডেলিগেট ইনস্ট্যান্স তৈরি করা হয়েছে এবং PrintMessage
মেথড অ্যাসাইন করা হয়েছে। ৪. ডেলিগেট কল করার মাধ্যমে PrintMessage
মেথডটি কল করা হয়েছে।
ডেলিগেটকে মাল্টিকাস্ট হিসেবে ব্যবহার করা যায়, যেখানে একাধিক মেথড একটিমাত্র ডেলিগেটের মাধ্যমে কল করা যায়।
MyDelegate del = PrintMessage;
del += AnotherMethod; // দ্বিতীয় মেথড যোগ করা
del("Hello multicast delegate!");
ইভেন্ট হলো বিশেষ ধরনের ডেলিগেট যা নির্দিষ্ট ঘটনাগুলির (event) প্রতিক্রিয়া জানাতে ব্যবহৃত হয়। ইভেন্টগুলো সাধারণত একটি ক্লাসের ভেতরে ডিক্লেয়ার করা হয় এবং সেই ক্লাসের বাইরে থেকে সাবস্ক্রাইব বা আনসাবস্ক্রাইব করা যায়। ইভেন্টের মাধ্যমে প্রোগ্রামের কোনো নির্দিষ্ট অবস্থায় কিছু কোড ট্রিগার করানো যায়।
ইভেন্ট ডিক্লেয়ার করতে event
কীওয়ার্ড ব্যবহার করা হয়।
public class Publisher
{
// ইভেন্ট ডিক্লেয়ারেশন
public event MyDelegate OnMessageReceived;
public void SendMessage(string message)
{
if (OnMessageReceived != null)
{
OnMessageReceived(message); // ইভেন্ট ট্রিগার করা
}
}
}
ইভেন্টের ব্যবহার বোঝাতে Publisher
এবং Subscriber
নামে দুটি ক্লাসের উদাহরণ দেওয়া হলো।
using System;
public class Publisher
{
// ডেলিগেট ডিক্লেয়ারেশন
public delegate void MyDelegate(string message);
// ইভেন্ট ডিক্লেয়ারেশন
public event MyDelegate OnMessageReceived;
public void SendMessage(string message)
{
if (OnMessageReceived != null)
{
OnMessageReceived(message); // ইভেন্ট ট্রিগার করা
}
}
}
public class Subscriber
{
public void MessageHandler(string message)
{
Console.WriteLine("Received message: " + message);
}
}
public class Program
{
public static void Main()
{
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();
// ইভেন্ট সাবস্ক্রাইব করা
publisher.OnMessageReceived += subscriber.MessageHandler;
// ইভেন্ট ট্রিগার করা
publisher.SendMessage("Hello, this is an event-driven message!");
}
}
১. Publisher
ক্লাসে একটি ইভেন্ট OnMessageReceived
ডিক্লেয়ার করা হয়েছে, যা ডেলিগেট MyDelegate
ব্যবহার করে। ২. SendMessage
মেথডের মাধ্যমে OnMessageReceived
ইভেন্টটি ট্রিগার করা হয়েছে। ৩. Subscriber
ক্লাসে MessageHandler
নামে একটি মেথড আছে যা ইভেন্টটি হ্যান্ডল করে। ৪. Main
মেথডে, publisher.OnMessageReceived += subscriber.MessageHandler;
এই লাইনটি ইভেন্ট সাবস্ক্রাইব করে। ৫. ইভেন্ট ট্রিগার হলে MessageHandler
মেথডটি চালানো হয় এবং মেসেজটি প্রিন্ট করে।
ডেলিগেট এবং ইভেন্ট ব্যবহার করে সি# এ কার্যকরী এবং ইভেন্ট-ড্রাইভেন প্রোগ্রাম তৈরি করা যায়, যা প্রোগ্রামের মডুলারিটি ও কার্যকারিতা বাড়ায়।
ডেলিগেট হলো সি#-এর একটি বিশেষ ধরনের রেফারেন্স টাইপ, যা মেথডকে রেফারেন্স করতে ব্যবহৃত হয়। সহজ ভাষায়, ডেলিগেট হচ্ছে এক ধরনের পয়েন্টার যা নির্দিষ্ট সিগনেচারের মেথডকে নির্দেশ করে। এটি ফাংশন পয়েন্টারের মতো কাজ করে এবং প্রোগ্রামে ফাংশনকে প্যারামিটার হিসাবে পাঠাতে সাহায্য করে।
ডেলিগেট ব্যবহার করে, আপনি একাধিক মেথডকে একটি একক রেফারেন্সের অধীনে সংযুক্ত করতে পারেন। এটি প্রায়ই ইভেন্ট হ্যান্ডলিং, কাস্টম কনফিগারেশন এবং অ্যাসিঙ্ক্রোনাস মেথড কলের জন্য ব্যবহৃত হয়।
ডেলিগেট ঘোষণার জন্য নিচের নিয়মটি মেনে চলতে হয়:
delegate returnType DelegateName(parameterList);
নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে একটি ডেলিগেট ঘোষণা করা হয়েছে এবং একটি মেথডকে পয়েন্ট করছে।
using System;
// ডেলিগেট ঘোষণা
public delegate void DisplayMessage(string message);
public class Program
{
// একটি মেথড যা ডেলিগেটের সাথে মিলিত
public static void ShowMessage(string message)
{
Console.WriteLine(message);
}
public static void Main()
{
// ডেলিগেট ইনস্ট্যান্স তৈরি করা এবং মেথড অ্যাসাইন করা
DisplayMessage display = ShowMessage;
// ডেলিগেট কল করা
display("Hello, this is a delegate example!");
}
}
উপরে DisplayMessage
নামে একটি ডেলিগেট তৈরি করা হয়েছে, যা string
প্যারামিটার গ্রহণ করে এবং কিছু রিটার্ন না করে। এই ডেলিগেটকে ShowMessage
মেথডের সাথে অ্যাসাইন করা হয়েছে এবং পরে display
ডেলিগেট কল করা হয়েছে, যা ShowMessage
মেথডটিকে কল করে।
ডেলিগেট ব্যবহারের মাধ্যমে প্রোগ্রামে কিছু গুরুত্বপূর্ণ সুবিধা পাওয়া যায়:
নিচে Calculator
নামের একটি ক্লাসে কয়েকটি অ্যারিথমেটিক অপারেশন করা হয়েছে এবং প্রতিটি অপারেশন ডেলিগেট ব্যবহার করে কল করা হয়েছে।
using System;
// ডেলিগেট ঘোষণা
public delegate int Calculate(int a, int b);
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
public int Subtract(int a, int b)
{
return a - b;
}
}
public class Program
{
public static void Main()
{
Calculator calc = new Calculator();
// ডেলিগেটের ইনস্ট্যান্স তৈরি এবং মেথড অ্যাসাইন
Calculate addOperation = calc.Add;
Calculate subtractOperation = calc.Subtract;
// ডেলিগেট কল করা
Console.WriteLine("Addition: " + addOperation(10, 5));
Console.WriteLine("Subtraction: " + subtractOperation(10, 5));
}
}
উপরের উদাহরণে, Calculate
নামে একটি ডেলিগেট তৈরি করা হয়েছে, যা দুটি int
প্যারামিটার গ্রহণ করে এবং একটি int
রিটার্ন করে। এই ডেলিগেটকে Add
এবং Subtract
মেথডের সাথে যুক্ত করা হয়েছে।
ডেলিগেটগুলোর একটি বৈশিষ্ট্য হলো মাল্টিকাস্ট ডেলিগেট। অর্থাৎ, একটি ডেলিগেটে একাধিক মেথড অ্যাসাইন করা সম্ভব এবং এগুলো ক্রমানুসারে কল করা হবে।
using System;
// ডেলিগেট ঘোষণা
public delegate void Notify();
public class Notifications
{
public void EmailNotification()
{
Console.WriteLine("Sending email notification...");
}
public void SMSNotification()
{
Console.WriteLine("Sending SMS notification...");
}
}
public class Program
{
public static void Main()
{
Notifications notifications = new Notifications();
// মাল্টিকাস্ট ডেলিগেট
Notify notifyAll = notifications.EmailNotification;
notifyAll += notifications.SMSNotification;
// ডেলিগেট কল করা
notifyAll();
}
}
এখানে, Notify
ডেলিগেট EmailNotification
এবং SMSNotification
মেথড দুটি পয়েন্ট করছে। notifyAll
ডেলিগেট কল করলে উভয় মেথড ক্রমানুসারে কল হবে।
সি# এ ডেলিগেটের কিছু প্রি-ডিফাইনড ফর্ম রয়েছে:
Func: এটি একটি ডেলিগেট যা এক বা একাধিক ইনপুট প্যারামিটার গ্রহণ করে এবং একটি আউটপুট প্রদান করে।
Func<int, int, int> add = (a, b) => a + b;
Console.WriteLine(add(10, 5)); // আউটপুট: 15
Action: এটি একটি ডেলিগেট যা এক বা একাধিক ইনপুট প্যারামিটার গ্রহণ করে, কিন্তু কিছু রিটার্ন করে না।
Action<string> greet = name => Console.WriteLine("Hello, " + name);
greet("John"); // আউটপুট: Hello, John
Predicate: এটি একটি ডেলিগেট যা একটি ইনপুট প্যারামিটার গ্রহণ করে এবং একটি bool
রিটার্ন করে।
Predicate<int> isEven = x => x % 2 == 0;
Console.WriteLine(isEven(4)); // আউটপুট: True
ডেলিগেট সি# প্রোগ্রামিংয়ে মেথডের রেফারেন্স ধরে রাখা, মেথড পাস করা, এবং মাল্টিকাস্টিংয়ের জন্য ব্যবহার করা হয়। এটি ইভেন্ট হ্যান্ডলিং, কাস্টম কনফিগারেশন এবং বিভিন্ন ফাংশনাল প্রোগ্রামিং কার্যক্রমে ব্যবহারযোগ্য।
সি# এ মাল্টিকাস্ট ডেলিগেট হলো এমন ধরনের ডেলিগেট, যা একাধিক মেথড রেফারেন্স ধরে রাখতে পারে এবং ক্রমানুসারে সেগুলোকে কল করতে পারে। মাল্টিকাস্ট ডেলিগেটের সুবিধা হলো, একবারে একাধিক মেথডকে একই ডেলিগেটের সাথে যুক্ত করা যায় এবং একটি এক্সিকিউশন লাইন থেকে তাদের চালানো যায়।
একটি মাল্টিকাস্ট ডেলিগেট তৈরি করতে, সাধারণ ডেলিগেটের মতোই ডিক্লেয়ার করা হয়। মেথডগুলোকে ডেলিগেটের সাথে সংযুক্ত (+=) বা পৃথক (–=) করা যায়। এটি প্রায়শই void
টাইপের মেথডের জন্য ব্যবহৃত হয়, কারণ এর রিটার্ন ভ্যালু শুধুমাত্র সর্বশেষ মেথডের ফলাফল প্রদান করে।
নিচে একটি মাল্টিকাস্ট ডেলিগেট উদাহরণ দেওয়া হলো:
using System;
public class Program
{
// ডেলিগেট ডিক্লারেশন
public delegate void MyDelegate();
// প্রথম মেথড
public static void MethodOne()
{
Console.WriteLine("Method One Executed");
}
// দ্বিতীয় মেথড
public static void MethodTwo()
{
Console.WriteLine("Method Two Executed");
}
public static void Main()
{
// মাল্টিকাস্ট ডেলিগেট তৈরি এবং মেথড অ্যাসাইন করা
MyDelegate del = MethodOne;
del += MethodTwo; // দ্বিতীয় মেথড যুক্ত করা
// ডেলিগেট কল করা
del();
// দ্বিতীয় মেথড পৃথক করা
del -= MethodTwo;
Console.WriteLine("\nAfter removing MethodTwo:");
// পুনরায় ডেলিগেট কল করা
del();
}
}
১. MyDelegate
নামে একটি ডেলিগেট তৈরি করা হয়েছে, যা void
টাইপ এবং কোনো প্যারামিটার গ্রহণ করে না। ২. MethodOne
এবং MethodTwo
নামে দুটি মেথড ডিক্লেয়ার করা হয়েছে। ৩. del
নামে একটি ডেলিগেট ইনস্ট্যান্স তৈরি করা হয়েছে এবং প্রথমে MethodOne
মেথড অ্যাসাইন করা হয়েছে। ৪. del += MethodTwo;
লাইনে MethodTwo
মেথড যুক্ত করা হয়েছে, যা মাল্টিকাস্ট ডেলিগেট তৈরি করেছে। ৫. del();
কল করা হলে প্রথমে MethodOne
এবং তারপর MethodTwo
কল হবে। ৬. এরপর MethodTwo
মেথডকে পৃথক (-=
) করা হয়েছে, ফলে শুধুমাত্র MethodOne
কল হয়।
void
টাইপের জন্য উপযুক্ত।এভাবে মাল্টিকাস্ট ডেলিগেটের মাধ্যমে একাধিক মেথডকে একত্রে কল করার সুবিধা নেওয়া যায়।
সি# এ ইভেন্ট এবং ইভেন্ট হ্যান্ডলার প্রোগ্রামিংয়ের অন্যতম গুরুত্বপূর্ণ ধারণা, যা বিশেষ করে ইভেন্ট-ড্রিভেন প্রোগ্রামিংয়ে ব্যবহার করা হয়। ইভেন্ট হলো একটি নোটিফিকেশন বা বার্তা যা নির্দিষ্ট কোনো কাজের সময় পাঠানো হয়, এবং ইভেন্ট হ্যান্ডলার হলো সেই মেথড, যা ইভেন্ট ট্রিগার হলে এক্সিকিউট হয়।
ইভেন্ট হলো একটি ঘোষণা যা বলে যে একটি নির্দিষ্ট অ্যাকশন বা কাজ ঘটেছে। উদাহরণস্বরূপ, একটি বাটন ক্লিক করলে ইভেন্ট তৈরি হয় এবং এটি ইভেন্ট হ্যান্ডলারকে জানিয়ে দেয় যে একটি ক্লিক ইভেন্ট ঘটেছে। ইভেন্টগুলো সাধারণত ডেলিগেটের ওপর ভিত্তি করে কাজ করে।
ইভেন্ট হ্যান্ডলার হলো একটি মেথড, যা ইভেন্ট ট্রিগার হওয়ার সময় কল হয়। সাধারণত ইভেন্ট হ্যান্ডলার ডেলিগেটের সাথে যুক্ত থাকে, এবং যখন ইভেন্ট ঘটে, তখন সেই ডেলিগেট ইভেন্ট হ্যান্ডলার মেথডকে কল করে।
১. ইভেন্ট ডেলিগেট ঘোষণা করা: প্রথমে, ইভেন্টের জন্য একটি ডেলিগেট তৈরি করতে হয়। ২. ইভেন্ট ঘোষণা করা: তারপর সেই ডেলিগেটের ভিত্তিতে একটি ইভেন্ট তৈরি করা হয়। ৩. ইভেন্ট হ্যান্ডলার মেথড তৈরি করা: ইভেন্টের জন্য একটি হ্যান্ডলার মেথড তৈরি করা হয়, যেখানে ইভেন্ট ট্রিগার হলে কী কাজ হবে তা নির্ধারণ করা হয়। ৪. ইভেন্ট সাবস্ক্রাইব করা: অবশেষে, ইভেন্ট হ্যান্ডলারকে ইভেন্টের সাথে যুক্ত করা হয়।
নিচে একটি উদাহরণ দেওয়া হলো যেখানে একটি ProcessCompleted
ইভেন্ট ঘোষণা করা হয়েছে এবং একটি ইভেন্ট হ্যান্ডলার যুক্ত করা হয়েছে।
using System;
// ডেলিগেট ঘোষণা করা
public delegate void ProcessCompletedEventHandler(object sender, EventArgs e);
public class Process
{
// ইভেন্ট ঘোষণা করা
public event ProcessCompletedEventHandler ProcessCompleted;
public void StartProcess()
{
Console.WriteLine("Process Started...");
// কিছু সময় পর প্রক্রিয়াটি শেষ হচ্ছে এমনটি ভাবুন
System.Threading.Thread.Sleep(2000);
// ইভেন্ট ট্রিগার করা
OnProcessCompleted();
}
// ইভেন্ট হ্যান্ডলারকে কল করার জন্য একটি সুরক্ষিত মেথড
protected virtual void OnProcessCompleted()
{
if (ProcessCompleted != null)
{
ProcessCompleted(this, EventArgs.Empty); // ইভেন্ট ট্রিগার করছে
}
}
}
public class Program
{
public static void Main()
{
Process process = new Process();
// ইভেন্ট সাবস্ক্রাইব করা (ইভেন্টের জন্য হ্যান্ডলার মেথড যুক্ত করা)
process.ProcessCompleted += ProcessCompletedHandler;
// প্রক্রিয়া শুরু করা
process.StartProcess();
}
// ইভেন্ট হ্যান্ডলার মেথড
public static void ProcessCompletedHandler(object sender, EventArgs e)
{
Console.WriteLine("Process Completed Successfully.");
}
}
১. ProcessCompletedEventHandler ডেলিগেট: এটি একটি ডেলিগেট যা ইভেন্টের জন্য ব্যবহৃত হয়েছে। ২. ProcessCompleted ইভেন্ট: Process
ক্লাসে ProcessCompleted
নামে একটি ইভেন্ট ঘোষণা করা হয়েছে, যা ProcessCompletedEventHandler
ডেলিগেটের ভিত্তিতে তৈরি হয়েছে। 3. OnProcessCompleted মেথড: এই মেথডটি ProcessCompleted
ইভেন্টকে ট্রিগার করে। 4. ProcessCompletedHandler ইভেন্ট হ্যান্ডলার: এটি ইভেন্ট হ্যান্ডলার মেথড যা ইভেন্টটি ট্রিগার হলে কল হয়।
উপরের উদাহরণে, যখন StartProcess
মেথড চালানো হয়, তখন কিছুক্ষণ পর ProcessCompleted
ইভেন্টটি ট্রিগার করা হয় এবং ProcessCompletedHandler
মেথডটি কল হয়।
১. ইউজার ইন্টারঅ্যাকশন: উইন্ডোজ বা ওয়েব অ্যাপ্লিকেশনে ইভেন্ট হ্যান্ডলার ব্যবহার করে ব্যবহারকারীর ক্রিয়াকলাপের (যেমন ক্লিক, টাইপিং) প্রতি সাড়া দেওয়া সম্ভব হয়। ২. অ্যাসিঙ্ক্রোনাস প্রসেসিং: ইভেন্ট ব্যবহারের মাধ্যমে অ্যাসিঙ্ক্রোনাস বা ব্যাকগ্রাউন্ড প্রসেসিং হ্যান্ডল করা সহজ হয়। ৩. মডুলার কোড: ইভেন্ট হ্যান্ডলার প্রোগ্রামের কোডকে আরও মডুলার এবং ব্যবস্থাপনা সহজ করে তোলে।
ইভেন্ট হলো এমন একটি ঘোষণা যা বলে দেয় যে নির্দিষ্ট কোনো কাজ সম্পন্ন হয়েছে, এবং ইভেন্ট হ্যান্ডলার হলো সেই মেথড যা ইভেন্ট ঘটার সময় চালানো হয়। ইভেন্ট এবং ইভেন্ট হ্যান্ডলার ব্যবহারের মাধ্যমে প্রোগ্রামকে আরও ইন্টারঅ্যাকটিভ এবং কার্যকরী করে তোলা যায়।
আরও দেখুন...